import type { RouteRecordRaw, RouteMeta } from 'vue-router';
import { RoleEnum } from '/@/enums/roleEnum';
import { defineComponent } from 'vue';

export type Component<T = any> =
  | ReturnType<typeof defineComponent>
  | (() => Promise<typeof import('*.vue')>)
  | (() => Promise<T>);

/**
 * 表示应用路由记录的接口，继承自 RouteRecordRaw。
 */
// @ts-ignore
export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
  /**
   * 路由名称。
   */
  name: string;

  /**
   * 路由元数据。RouteMeta 是 Vue Router 中用于定义路由元数据的接口
   */
  meta: RouteMeta;

  /**
   * 组件（可以是组件对象或组件名称）。
   */
  component?: Component | string;

  /**
   * 组件列表。
   */
  components?: Component;

  /**
   * 子路由列表。
   */
  children?: AppRouteRecordRaw[];

  /**
   * 路由参数。
   */
  props?: Recordable;

  /**
   * 完整的路由路径。
   */
  fullPath?: string;
}

export interface MenuTag {
  type?: 'primary' | 'error' | 'warn' | 'success';
  content?: string;
  dot?: boolean;
}

/**
 * 菜单项接口
 */
export interface Menu {
  /**
   * 菜单名称，用于显示
   */
  name: string;
  /**
   * 可选，指定菜单图标
   */
  icon?: string;
  /**
   * 菜单路径，对应路由路径
   */
  path: string;
  /**
   * 可选，当菜单路径包含参数时的路径，会自动处理参数赋值
   */
  paramPath?: string;
  /**
   * 可选，指示菜单项是否被禁用
   */
  disabled?: boolean;
  /**
   * 可选，子菜单项数组
   */
  children?: Menu[];
  /**
   * 可选，菜单项排序编号，用于控制菜单显示顺序
   */
  orderNo?: number;
  /**
   * 可选，定义菜单项的角色权限枚举，控制访问权限
   */
  roles?: RoleEnum[];
  /**
   * 可选，路由元信息部分字段，对应 Vue-Router 中的 meta 信息
   */
  meta?: Partial<RouteMeta>;
  /**
   * 可选，菜单项标签，用于显示额外的信息或标记
   */
  tag?: MenuTag;
  /**
   * 可选，指示是否在菜单列表中隐藏此菜单项
   */
  hideMenu?: boolean;
}

/**
 * 菜单模块接口
 */
export interface MenuModule {
  /**
   * 菜单模块的排序号，可选字段，用于确定菜单模块显示的顺序
   */
  orderNo?: number;
  /**
   * 包含的菜单项
   */
  menu: Menu;
}

// export type AppRouteModule = RouteModule | AppRouteRecordRaw;
export type AppRouteModule = AppRouteRecordRaw;
